package basicas;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

import java.util.Collection;
import java.util.Date;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
public class Evento  implements Cloneable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;
	private String nomeEvento;
	
	@ManyToOne
	@JoinColumn(name = "idCategoria")
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private CategoriaEvento categoria;

	@ManyToOne
	@JoinColumn(name = "idLocalidade")
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private LocalidadeEvento localidade;

	@Temporal(TemporalType.DATE)
	private Date dataEvento;

	private double custoEventos;
	private int qtdIngressosVendidos;
	private int qtdIngressosAVendaEstudante;
	private int qtdIngressosAVendaVip;
	private int qtdIngressosAVendaInteira;
	private int qtdIngressosAVendaTotal;
	
	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "Evento_Artista", joinColumns = { @JoinColumn(name = "idEvento") }, inverseJoinColumns = { @JoinColumn(name = "idArtista") })
	private Collection<Artista> artista;
	private double faturamento;
	
	@Version
	private Date dataUltimaAtualizacao;

	public Object clone () throws CloneNotSupportedException{
		return super.clone();
	}
	
	public double getFaturamento() {
		return faturamento;
	}

	public void setFaturamento(double faturamento) {
		this.faturamento = faturamento;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public CategoriaEvento getCategoria() {
		return categoria;
	}

	public void setCategoria(CategoriaEvento categoria) {
		this.categoria = categoria;
	}

	public LocalidadeEvento getLocalidade() {
		return localidade;
	}

	public void setLocalidade(LocalidadeEvento localidade) {
		this.localidade = localidade;
	}

	public Date getDataEvento() {
		return dataEvento;
	}

	public void setDataEvento(Date dataEvento) {
		this.dataEvento = dataEvento;
	}

	public double getCustoEventos() {
		return custoEventos;
	}

	public void setCustoEventos(double custoEventos) {
		this.custoEventos = custoEventos;
	}

	public int getQtdIngressosVendidos() {
		return qtdIngressosVendidos;
	}

	public void setQtdIngressosVendidos(int qtdIngressosVendidos) {
		this.qtdIngressosVendidos = qtdIngressosVendidos;
	}

	public void setQtdIngressosAVenda(int qtdIngressosAVenda) {
		this.qtdIngressosAVendaTotal = qtdIngressosAVenda;
	}

	public int getQtdIngressosAVenda() {
		return qtdIngressosAVendaTotal;
	}

	public String getNomeEvento() {
		return nomeEvento;
	}

	public void setNomeEvento(String nomeEvento) {
		this.nomeEvento = nomeEvento;
	}

	public void setArtista(Collection<Artista> artista) {
		this.artista = artista;
	}

	public Collection<Artista> getArtista() {
		return artista;
	}

	public int getQtdIngressosAVendaTotal() {
		return qtdIngressosAVendaTotal;
	}

	public void setQtdIngressosAVendaTotal(int qtdIngressosAVendaTotal) {
		this.qtdIngressosAVendaTotal = qtdIngressosAVendaTotal;
	}

	public int getQtdIngressosAVendaInteira() {
		return qtdIngressosAVendaInteira;
	}

	public void setQtdIngressosAVendaInteira(int qtdIngressosAVendaInteira) {
		this.qtdIngressosAVendaInteira = qtdIngressosAVendaInteira;
	}

	public int getQtdIngressosAVendaVip() {
		return qtdIngressosAVendaVip;
	}

	public void setQtdIngressosAVendaVip(int qtdIngressosAVendaVip) {
		this.qtdIngressosAVendaVip = qtdIngressosAVendaVip;
	}

	public int getQtdIngressosAVendaEstudante() {
		return qtdIngressosAVendaEstudante;
	}

	public void setQtdIngressosAVendaEstudante(int qtdIngressosAVendaEstudante) {
		this.qtdIngressosAVendaEstudante = qtdIngressosAVendaEstudante;
	}

	public Evento() {
		super();
	}

	public Evento(String nomeEvento, CategoriaEvento categoria,
			LocalidadeEvento localidade, Date dataEvento,
			double custoEventos, int qtdIngressosVendidos,
			int qtdIngressosAVendaEstudante, int qtdIngressosAVendaVip,
			int qtdIngressosAVendaInteira, int qtdIngressosAVendaTotal,
			Collection<Artista> artista, double faturamento) {
		super();
		
		this.nomeEvento = nomeEvento;
		this.categoria = categoria;
		this.localidade = localidade;
		this.dataEvento = dataEvento;
		this.custoEventos = custoEventos;
		this.qtdIngressosVendidos = qtdIngressosVendidos;
		this.qtdIngressosAVendaEstudante = qtdIngressosAVendaEstudante;
		this.qtdIngressosAVendaVip = qtdIngressosAVendaVip;
		this.qtdIngressosAVendaInteira = qtdIngressosAVendaInteira;
		this.qtdIngressosAVendaTotal = qtdIngressosAVendaTotal;
		this.setArtista(artista);
		this.faturamento = faturamento;
	}

	@Override
	public String toString() {
		return "Evento [nomeEvento=" + nomeEvento
				+ ", categoria=" + categoria + ", localidade=" + localidade
				+ ", dataEvento=" + dataEvento + "]";
	}

	public Date getDataUltimaAtualizacao() {
		return dataUltimaAtualizacao;
	}

	public void setDataUltimaAtualizacao(Date dataUltimaAtualizacao) {
		this.dataUltimaAtualizacao = dataUltimaAtualizacao;
	}


	

	
	
}
